/*
  二分法求函数的零点
  题目描述
    有函数：f(x) = x^5 − 15 * x^4 + 85 * x^3 − 225 * x^2 + 274 * x − 121
    已知 f(1.5) > 0, f(2.4) < 0 且方程 f(x) = 0 在区间 [1.5, 2.4] 有且只有一个根，请用二分法求出该根。
  输入
    无
  输出
    该方程在区间 [1.5, 2.4] 中的根。要求四舍五入到小数点后 6 位。
*/

#include <bits/stdc++.h>

using namespace std;

/*
  精确度 0.00000001.
  注意: 题目要求四舍五入到小数点后 6 位，考虑四舍五入的影响, 我们需要同时再多往后看 2 位!
        也就是看小数点后 8 位!
*/
const double N = 1e-8;

/*
  该函数计算式如下:
    f(x) = x^5 − 15 * x^4 + 85 * x^3 − 225 * x^2 + 274 * x − 121
  输入参数 x 为 1.5 ~ 2.4 之间的浮点数
  返回值为浮点型数
*/
double f(double x) {
    return pow(x, 5) - 15 * pow(x, 4) + 85 * pow(x, 3) - 225 * pow(x, 2) + 274 * x - 121;
}

/*
  注意:
    分别对浮点数和整数序列进行二分查找时，对应的代码逻辑的差异点如下:
    1). 移动下标时的差异:
          浮点数时，移动下标要考虑精确度
          整形数时，移动下标时都是以整数为单位 (如: +1)
    2). 循环退出条件上有差异:
          浮点数时，左右下标的差值在精确度范围内 (e - s < N)，即可以认为达到循环退出条件!
          整形数时, s > e 达到循环退出条件
    3). 循环内部的分支判断：
          浮点数时，由于存在浮点精确度的影响，中间下标处的值和待比较的值相等(采用默认精确度)时还需要
            考虑精确度，取精确度最高的作为最终的循环退出条件!
          整形数时, 如果中间下标处的值和待比较的值相等, 则说明已经找到, 达到循环退出条件!
*/
int main() {
    /*
      s 和 e 确定了二分查找的数据范围(对应的下标),
        其中, s (start) 为开始下标(左下标), e (end) 为结束下标(右下标);
      m 为二分查找算法使用的中间下标。
    */
    double s = 1.5, e = 2.4, m;
    while (e - s >= N) { // 浮点数 e 和 s 的退出条件!
        m = (s + e) / 2;
        if (f(m) >= 0) { // 注意: 这里浮点数 f(m) == 0 时使用默认精确度, 这个精确度比 N 要低!
            s = m + N;
        } else {
            e = m - N;
        }
    }
    cout << fixed << setprecision(6) << s;

    return 0;
}